﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Happy.PessimisticLock
{
    /// <summary>
    /// 离线悲观锁管理器接口。
    /// </summary>
    public interface ILockManager
    {
        /// <summary>
        /// 获取锁。
        /// </summary>
        /// <param name="entity">锁的主体，如：表名或聚合名。</param>
        /// <param name="key">锁的主体的唯一标识，如：主键或唯一索引。</param>
        /// <param name="owner">锁的拥有者，如：UserId或SessionId。</param>
        /// <param name="expirationPolicy">过期策略。</param>
        /// <returns>获取锁成功就返回true，否则返回false。</returns>
        bool AcquireLock(string entity, string key, string owner, IExpirationPolicy expirationPolicy);

        /// <summary>
        /// 释放锁。
        /// </summary>
        /// <param name="entity">锁的主体，如：表名或聚合名。</param>
        /// <param name="key">锁的主体的唯一标识，如：主键或唯一索引。</param>
        /// <param name="owner">锁的拥有者，如：UserId或SessionId。</param>
        void ReleaseLock(string entity, string key, string owner);

        /// <summary>
        /// 释拥有者的所有锁。
        /// </summary>
        /// <param name="owner">锁的拥有者，如：UserId或SessionId。</param>
        void ReleaseLocks(string owner);


        /// <summary>
        /// 释放过期的锁，以节省空间。
        /// </summary>
        void ReleaseExpiredLocks();
    }
}
